Skip to content

Latest commit

 

History

History
58 lines (48 loc) · 1.27 KB

4.1.1 - Coroutine::getuid.md

File metadata and controls

58 lines (48 loc) · 1.27 KB

Coroutine::getuid

获取当前协程的唯一ID

function \Swoole\Coroutine::getuid() : int

仅在当前进程内唯一

返回值

  • 成功时返回当前协程ID(int)
  • 如果当前不在协程环境中,则返回-1
echo Swoole\Coroutine::getuid();

cid分配机制

相关issue

cid map 使用了 bit map, 它在分配时总是会寻找下一个可用的比特位

我们可以通过以下代码来确认这个事实:

co::set([
    'max_coroutine' => PHP_INT_MAX,
    'log_level' => SWOOLE_LOG_INFO,
    'trace_flags' => 0
]);
$map = [];
while (true) {
    if (empty($map)){
        $cid = go(function () {co::sleep(5);});
    }else{
        $cid = go(function () { });
    }
    if (!isset($map[$cid])) {
        $map[$cid] = $cid;
    } else {
        var_dump(end($map));
        var_dump($cid);
        exit;
    }
}

它将会打印:

int(524288)
int(2)

所以我们有 MAX_CORO_NUM_LIMIT => 0x80000 则在同一时间同一进程的协程数也不能超过 524288

虽然它的分配数量存在上限, 但这个数值非常大, 一个进程不可能同时存在这么多协程, 除非你有一台超大内存的机器, 但那时候你也不必再担心这个问题